package com.xunk.scene.domain;

import cn.hutool.core.util.ArrayUtil;
import com.xunk.common.core.annotation.EnumCheck;
import com.xunk.common.core.annotation.Excel;
import com.xunk.common.core.text.Convert;
import com.xunk.common.core.utils.StringUtils;
import com.xunk.common.core.web.domain.BaseEntity;
import com.xunk.scene.enums.RepeatTypeEnum;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.Arrays;
import java.util.stream.Collectors;

/**
 * @ProjectName: HIM
 * @Package: com.xunk.scene.domain
 * @ClassName: EffectivePeriodCondition
 * @Author: luanzhiwei
 * @Description: 生效时间段表实体类
 * @Date: 2021/5/6 10:53
 * @Version: 1.0
 */
@Data
@ToString
@NoArgsConstructor
@EqualsAndHashCode
public class SceneConditionEffectivePeriod extends BaseEntity implements Serializable {
    private static final long serialVersionUID = 1L;

    /**
     * 自增主键
     */
    private Long id;

    /**
     * 场景id
     */
    @Excel(name = "场景id")
    @NotNull(message = "场景id不能为空", groups = {Add.class, Model.class})
    private Long sceneId;

    /**
     * 生效开始时间，前端字段，拆分effectivePeriod
     */
    @NotBlank(message = "生效开始时间不能为空", groups = {Add.class, Model.class})
    private String startTime;
    /**
     * 生效结束时间，前端字段，拆分effectivePeriod
     */
    @NotBlank(message = "生效结束时间不能为空", groups = {Add.class, Model.class})
    private String stopTime;
    /**
     * 生效时段，例如8:00-9:00,默认全天生效
     */
    @Excel(name = "生效时段，例如8:00-9:00")
    private String effectivePeriod;

    /**
     * 重复类型，每天 EVERYDAY,工作日 WORKDAY, 周末 WEEKEND, 周一到周五 WEEKDAY, 特定某天 SPECIFIC，默认每天
     * 返回前端repeatType为 "" 时，前端默认解析为全天。如果前端保存时不传 SceneConditionEffectivePeriod ，
     * 后端默认存储全天 即repeatType = EVERYDAY + effectivePeriod = “00:00-00:00”
     */
    private String repeatType;
    /**
     * 重复类型，前端字段
     */
    @EnumCheck(enableClass = RepeatTypeEnum.class, groups = {Add.class, Model.class})
    private String jobType;
    /**
     * 与前端交互字段，自定义周几 [1,2,3]，拆分specificDay
     */
    private int[] dayOfWeeks;
    /**
     * 自定义周几 1,2,4等
     */
    @Excel(name = "特定某天")
    private String specificDay;
    /**
     * 是否必要（预留 跟条件分组id配合使用，该分组条件下，子条件之间的关系）
     * 0 匹配一条 1 全部匹配
     */
    @Excel(name = "是否必要", readConverterExp = "预留")
    private String essentialFlag;

    /**
     * 条件分组id，预留，用于同一场景条件下使用。
     * 例如，条件1： 17点到19点 + 门锁打开 或 定位在家中。条件2:8点到9点+ 床头灯打开。这是一个场景下的两组条件
     */
    private String tranche;

    /**
     * 删除标识0正常，1删除
     */
    private String delFlag;

    public String getEffectivePeriod() {
        return StringUtils.isEmpty(effectivePeriod) ?
                (StringUtils.isNotEmpty(startTime) && StringUtils.isNotEmpty(stopTime)) ? startTime.concat("-").concat(stopTime) :
                        StringUtils.EMPTY : effectivePeriod;
    }

    public void setEffectivePeriod(String effectivePeriod) {
        this.effectivePeriod = StringUtils.isEmpty(effectivePeriod) ?
                (StringUtils.isNotEmpty(startTime) && StringUtils.isNotEmpty(stopTime)) ? startTime.concat("-").concat(stopTime) :
                        StringUtils.EMPTY : effectivePeriod;
    }

    public String getStartTime() {
        return StringUtils.isEmpty(startTime) ? StringUtils.isEmpty(effectivePeriod) ? StringUtils.EMPTY : effectivePeriod.split("-")[0] : startTime;
    }

    public String getStopTime() {
        return StringUtils.isEmpty(stopTime) ? StringUtils.isEmpty(effectivePeriod) ? StringUtils.EMPTY : effectivePeriod.split("-")[1] : stopTime;
    }

    public int[] getDayOfWeeks() {
        return ArrayUtil.isEmpty(dayOfWeeks) ?
                StringUtils.isEmpty(specificDay) ? new int[0] : Arrays.stream(specificDay.split(",")).mapToInt(item -> Convert.toInt(item)).toArray() : dayOfWeeks;
    }

    public String getSpecificDay() {
        return StringUtils.isEmpty(specificDay) ?
                ArrayUtil.isEmpty(dayOfWeeks) ? "" : Arrays.stream(dayOfWeeks).boxed().map(item -> Convert.toStr(item)).collect(Collectors.joining(",")) : specificDay;
    }

    public void setSpecificDay(String specificDay) {
        this.specificDay = StringUtils.isEmpty(specificDay) ?
                ArrayUtil.isEmpty(dayOfWeeks) ? "" : Arrays.stream(dayOfWeeks).boxed().map(item -> Convert.toStr(item)).collect(Collectors.joining(",")) : specificDay;
    }

    public String getRepeatType() {
        return StringUtils.isEmpty(repeatType) ?
                StringUtils.isEmpty(jobType) ? StringUtils.EMPTY : jobType : repeatType;
    }

    public void setRepeatType(String repeatType) {
        this.repeatType = StringUtils.isEmpty(repeatType) ? jobType : repeatType;
    }

    public String getJobType() {
        return StringUtils.isEmpty(jobType) ? repeatType : jobType;
    }

    public interface Add {
        //校验分组，添加
    }

    public interface Model {
        //设置模板
    }
}
